会话技术
今日目标
理解什么是会话跟踪技术
掌握
Cookie
的使用
掌握
Session
的使用
完善用户登录注册案例的功能
1
,会话跟踪技术的概述
对于
会
话
跟
踪
这四个词,我们需要拆开来进行解释,首先要理解什么是
会
话
,然后再去理解什么是
会
话
跟
踪
:
会话
:
用户打开浏览器,访问
web
服务器的资源,会话建立,直到有一方断开连接,会话结束。在
一次会话中可以包含
多次
请求和响应。
从浏览器发出请求到服务端响应数据给前端之后,一次会话
(
在浏览器和服务器之间
)
就被建立
了
会话被建立后,如果浏览器或服务端都没有被关闭,则会话就会持续建立着
浏览器和服务器就可以继续使用该会话进行请求发送和响应,上述的整个过程就被称之为
会
话
。
用实际场景来理解下会话,比如在我们访问京东的时候,当打开浏览器进入京东首页后,浏览器和
京东的服务器之间就建立了一次会话,后面的搜索商品
,
查看商品的详情
,
加入购物车等都是在这一
次会话中完成。
思考
:
下图中总共建立了几个会话
?
每个浏览器都会与服务端建立了一个会话,加起来总共是
3
个会话。
Evaluation Warning : The document was created with Spire.PDF for java.
会话跟踪
:
一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一浏览器,以便在
同一次会话的多次请求间
共享数据
。
服务器会收到多个请求,这多个请求可能来自多个浏览器,如上图中的
6
个请求来自
3
个浏览器
服务器需要用来识别请求是否来自同一个浏览器
服务器用来识别浏览器的过程,这个过程就是
会话跟踪
服务器识别浏览器后就可以在同一个会话中多次请求之间来共享数据
那么我们又有一个问题需要思考,一个会话中的多次请求为什么要共享数据呢
?
有了这个数据共享
功能后能实现哪些功能呢
?
购物车
:
加
入
购
物
车
和
去
购
物
车
结
算
是两次请求,但是后面这次请求要想展示前一次请求所添加
的商品,就需要用到数据共享。
页面展示用户登录信息
:
很多网站,登录后访问多个功能发送多次请求后,浏览器上都会有当前
登录用户的信息
[
用户名
]
,比如百度、京东、码云等。
网站登录页面的
记
住
我
功能
:
当用户登录成功后,勾选
记
住
我
按钮后下次再登录的时候,网站就
会自动填充用户名和密码,简化用户的登录操作,多次登录就会有多次请求,他们之间也涉及
到共享数据
Evaluation Warning : The document was created with Spire.PDF for java.
登录页面的验证码功能
:
生成验证码和输入验证码点击注册这也是两次请求,这两次请求的数据
之间要进行对比,相同则允许注册,不同则拒绝注册,该功能的实现也需要在同一次会话中共
享数据。
通过这几个例子的讲解,相信大家对
会
话
追
踪
技术已经有了一定的理解,该技术在实际开发中也非常
重要。那么接下来我们就需要去学习下
会
话
跟
踪
技术,在学习这些技术之前,我们需要思考
:
为什么现
在浏览器和服务器不支持数据共享呢
?
浏览器和服务器之间使用的是
HTTP
请求来进行数据传输
HTTP
协议是
无状态
的,每次浏览器向服务器请求时,服务器都会将该请求视为
新的
请求
HTTP
协议设计成无状态的目的是让每次请求之间相互独立,互不影响
请求与请求之间独立后,就无法实现多次请求之间的数据共享
分析完具体的原因后,那么该如何实现会话跟踪技术呢
?
具体的实现方式有
:
(1)
客户端会话跟踪技术:
Cookie
(2)
服务端会话跟踪技术:
Session
这两个技术都可以实现会话跟踪,它们之间最大的区别
:
Cookie
是存储在浏览器端而
Session
是存储
在服务器端
具体的学习思路为
:
CooKie
的基本使用、原理、使用细节
Session
的基本使用、原理、使用细节
Cookie
和
Session
的综合案例
Evaluation Warning : The document was created with Spire.PDF for java.
小结
在这节中,我们主要介绍了下什么是会话和会话跟踪技术,需要注意的是
:
HTTP
协议是无状态的,靠
HTTP
协议是无法实现会话跟踪
想要实现会话跟踪,就需要用到
Cookie
和
Session
这个
Cookie
和
Session
具体该如何使用,接下来就先从
Cookie
来学起。
2
,
Cookie
学习
Cookie
,我们主要解决下面几个问题
:
什么是
Cookie?
Cookie
如何来使用
?
Cookie
是如何实现的
?
Cookie
的使用注意事项有哪些
?
2.1 Cookie
的基本使用
1.
概念
Cookie
:客户端会话技术,将数据保存到客户端,以后每次请求都携带
Cookie
数据进行访问。
2.Cookie
的工作流程
服务端提供了两个
Servlet
,分别是
ServletA
和
ServletB
浏览器发送
HTTP
请求
1
给服务端,服务端
ServletA
接收请求并进行业务处理
服务端
ServletA
在处理的过程中可以创建一个
Cookie
对象并将
n
a
m
e
=
z
s
的数据存入
Cookie
服务端
ServletA
在响应数据的时候,会把
Cookie
对象响应给浏览器
浏览器接收到响应数据,会把
Cookie
对象中的数据存储在浏览器内存中,此时浏览器和服务端就
建立了一次会话
Evaluation Warning : The document was created with Spire.PDF for java.
在同一次会话
中浏览器再次发送
HTTP
请求
2
给服务端
ServletB
,浏览器会携带
Cookie
对象中的
所有数据
ServletB
接收到请求和数据后,就可以获取到存储在
Cookie
对象中的数据,这样同一个会话中
的多次请求之间就实现了数据共享
3.Cookie
的基本使用
对于
Cookie
的使用,我们更关注的应该是后台代码如何操作
Cookie
,对于
Cookie
的操作主要分两大
类,本别是
发送
Cookie
和
获取
Cookie
,
对于上面这两块内容,分别该如何实现呢
?
3.1
发送
Cookie
创建
Cookie
对象,并设置数据
发送
Cookie
到客户端:使用
response
对象
介绍完发送
Cookie
对应的步骤后,接下面通过一个案例来完成
Cookie
的发送,具体实现步骤为
:
需求
:
在
Servlet
中生成
Cookie
对象并存入数据,然后将数据发送给浏览器
1.
创建
Maven
项目
,
项目名称为
cookie-demo
,并在
pom.xml
添加依赖
2.
编写
Servlet
类,名称为
AServlet
3.
在
AServlet
中创建
Cookie
对象,存入数据,发送给前端
4.
启动测试,在浏览器查看
Cookie
对象中的值
(1)
创建
Maven
项目
cookie-demo
,并在
pom.xml
添加依赖
C
o
o
k
i
e
c
o
o
k
i
e
=
n
e
w
C
o
o
k
i
e
(
"
k
e
y
"
,
"
v
a
l
u
e
"
)
;
1
r
e
s
p
o
n
s
e
.
a
d
d
C
o
o
k
i
e
(
c
o
o
k
i
e
)
;
1
<
p
r
o
p
e
r
t
i
e
s
>
<
m
a
v
e
n
.
c
o
m
p
i
l
e
r
.
s
o
u
r
c
e
>
8
<
/
m
a
v
e
n
.
c
o
m
p
i
l
e
r
.
s
o
u
r
c
e
>
<
m
a
v
e
n
.
c
o
m
p
i
l
e
r
.
t
a
r
g
e
t
>
8
<
/
m
a
v
e
n
.
c
o
m
p
i
l
e
r
.
t
a
r
g
e
t
>
<
/
p
r
o
p
e
r
t
i
e
s
>
<
d
e
p
e
n
d
e
n
c
i
e
s
>
<
!
-
-
s
e
r
v
l
e
t
-
-
>
<
d
e
p
e
n
d
e
n
c
y
>
<
g
r
o
u
p
I
d
>
j
a
v
a
x
.
s
e
r
v
l
e
t
<
/
g
r
o
u
p
I
d
>
<
a
r
t
i
f
a
c
t
I
d
>
j
a
v
a
x
.
s
e
r
v
l
e
t
-
a
p
i
<
/
a
r
t
i
f
a
c
t
I
d
>
<
v
e
r
s
i
o
n
>
3
.
1
.
0
<
/
v
e
r
s
i
o
n
>
<
s
c
o
p
e
>
p
r
o
v
i
d
e
d
<
/
s
c
o
p
e
>
<
/
d
e
p
e
n
d
e
n
c
y
>
<
!
-
-
j
s
p
-
-
>
<
d
e
p
e
n
d
e
n
c
y
>
<
g
r
o
u
p
I
d
>
j
a
v
a
x
.
s
e
r
v
l
e
t
.
j
s
p
<
/
g
r
o
u
p
I
d
>
1
2
3
4
5
6
7
8
9
1
0
1
1
1
2
1
3
1
4
1
5
1
6
Evaluation Warning : The document was created with Spire.PDF for java.
(2)
编写
Servlet
类,名称为
AServlet
(3)
在
Servlet
中创建
Cookie
对象,存入数据,发送给前端
<
a
r
t
i
f
a
c
t
I
d
>
j
s
p
-
a
p
i
<
/
a
r
t
i
f
a
c
t
I
d
>
<
v
e
r
s
i
o
n
>
2
.
2
<
/
v
e
r
s
i
o
n
>
<
s
c
o
p
e
>
p
r
o
v
i
d
e
d
<
/
s
c
o
p
e
>
<
/
d
e
p
e
n
d
e
n
c
y
>
<
!
-
-
j
s
t
l
-
-
>
<
d
e
p
e
n
d
e
n
c
y
>
<
g
r
o
u
p
I
d
>
j
s
t
l
<
/
g
r
o
u
p
I
d
>
<
a
r
t
i
f
a
c
t
I
d
>
j
s
t
l
<
/
a
r
t
i
f
a
c
t
I
d
>
<
v
e
r
s
i
o
n
>
1
.
2
<
/
v
e
r
s
i
o
n
>
<
/
d
e
p
e
n
d
e
n
c
y
>
<
d
e
p
e
n
d
e
n
c
y
>
<
g
r
o
u
p
I
d
>
t
a
g
l
i
b
s
<
/
g
r
o
u
p
I
d
>
<
a
r
t
i
f
a
c
t
I
d
>
s
t
a
n
d
a
r
d
<
/
a
r
t
i
f
a
c
t
I
d
>
<
v
e
r
s
i
o
n
>
1
.
1
.
2
<
/
v
e
r
s
i
o
n
>
<
/
d
e
p
e
n
d
e
n
c
y
>
<
/
d
e
p
e
n
d
e
n
c
i
e
s
>
<
b
u
i
l
d
>
<
p
l
u
g
i
n
s
>
<
p
l
u
g
i
n
>
<
g
r
o
u
p
I
d
>
o
r
g
.
a
p
a
c
h
e
.
t
o
m
c
a
t
.
m
a
v
e
n
<
/
g
r
o
u
p
I
d
>
<
a
r
t
i
f
a
c
t
I
d
>
t
o
m
c
a
t
7
-
m
a
v
e
n
-
p
l
u
g
i
n
<
/
a
r
t
i
f
a
c
t
I
d
>
<
v
e
r
s
i
o
n
>
2
.
2
<
/
v
e
r
s
i
o
n
>
<
/
p
l
u
g
i
n
>
<
/
p
l
u
g
i
n
s
>
<
/
b
u
i
l
d
>
1
7
1
8
1
9
2
0
2
1
2
2
2
3
2
4
2
5
2
6
2
7
2
8
2
9
3
0
3
1
3
2
3
3
3
4
3
5
3
6
3
7
3
8
3
9
4
0
4
1
@
W
e
b
S
e
r
v
l
e
t
(
"
/
a
S
e
r
v
l
e
t
"
)
p
u
b
l
i
c
c
l
a
s
s
A
S
e
r
v
l
e
t
e
x
t
e
n
d
s
H
t
t
p
S
e
r
v
l
e
t
{
@
O
v
e
r
r
i
d
e
p
r
o
t
e
c
t
e
d
v
o
i
d
d
o
G
e
t
(
H
t
t
p
S
e
r
v
l
e
t
R
e
q
u
e
s
t
r
e
q
u
e
s
t
,
H
t
t
p
S
e
r
v
l
e
t
R
e
s
p
o
n
s
e
r
e
s
p
o
n
s
e
)
t
h
r
o
w
s
S
e
r
v
l
e
t
E
x
c
e
p
t
i
o
n
,
I
O
E
x
c
e
p
t
i
o
n
{
}
@
O
v
e
r
r
i
d
e
p
r
o
t
e
c
t
e
d
v
o
i
d
d
o
P
o
s
t
(
H
t
t
p
S
e
r
v
l
e
t
R
e
q
u
e
s
t
r
e
q
u
e
s
t
,
H
t
t
p
S
e
r
v
l
e
t
R
e
s
p
o
n
s
e
r
e
s
p
o
n
s
e
)
t
h
r
o
w
s
S
e
r
v
l
e
t
E
x
c
e
p
t
i
o
n
,
I
O
E
x
c
e
p
t
i
o
n
{
t
h
i
s
.
d
o
G
e
t
(
r
e
q
u
e
s
t
,
r
e
s
p
o
n
s
e
)
;
}
}
1
2
3
4
5
6
7
8
9
1
0
1
1
1
2
@
W
e
b
S
e
r
v
l
e
t
(
"
/
a
S
e
r
v
l
e
t
"
)
p
u
b
l
i
c
c
l
a
s
s
A
S
e
r
v
l
e
t
e
x
t
e
n
d
s
H
t
t
p
S
e
r
v
l
e
t
{
@
O
v
e
r
r
i
d
e
1
2
3
Evaluation Warning : The document was created with Spire.PDF for java.
(
4
)启动测试,在浏览器查看
Cookie
对象中的值
访问
h
t
t
p
:
/
/
l
o
c
a
l
h
o
s
t
:
8
0
8
0
/
c
o
o
k
i
e
-
d
e
m
o
/
a
S
e
r
v
l
e
t
chrome
浏览器查看
Cookie
的值,有两种方式
,
分布式
:
方式一
:
p
r
o
t
e
c
t
e
d
v
o
i
d
d
o
G
e
t
(
H
t
t
p
S
e
r
v
l
e
t
R
e
q
u
e
s
t
r
e
q
u
e
s
t
,
H
t
t
p
S
e
r
v
l
e
t
R
e
s
p
o
n
s
e
r
e
s
p
o
n
s
e
)
t
h
r
o
w
s
S
e
r
v
l
e
t
E
x
c
e
p
t
i
o
n
,
I
O
E
x
c
e
p
t
i
o
n
{
/
/
发
送
C
o
o
k
i
e
/
/
1
.
创
建
C
o
o
k
i
e
对
象
C
o
o
k
i
e
c
o
o
k
i
e
=
n
e
w
C
o
o
k
i
e
(
"
u
s
e
r
n
a
m
e
"
,
"
z
s
"
)
;
/
/
2
.
发
送
C
o
o
k
i
e
,
r
e
s
p
o
n
s
e
r
e
s
p
o
n
s
e
.
a
d
d
C
o
o
k
i
e
(
c
o
o
k
i
e
)
;
}
@
O
v
e
r
r
i
d
e
p
r
o
t
e
c
t
e
d
v
o
i
d
d
o
P
o
s
t
(
H
t
t
p
S
e
r
v
l
e
t
R
e
q
u
e
s
t
r
e
q
u
e
s
t
,
H
t
t
p
S
e
r
v
l
e
t
R
e
s
p
o
n
s
e
r
e
s
p
o
n
s
e
)
t
h
r
o
w
s
S
e
r
v
l
e
t
E
x
c
e
p
t
i
o
n
,
I
O
E
x
c
e
p
t
i
o
n
{
t
h
i
s
.
d
o
G
e
t
(
r
e
q
u
e
s
t
,
r
e
s
p
o
n
s
e
)
;
}
}
4
5
6
7
8
9
1
0
1
1
1
2
1
3
1
4
1
5
1
6
Evaluation Warning : The document was created with Spire.PDF for java.
Evaluation Warning : The document was created with Spire.PDF for java.
方式二
:
选中打开开发者工具或者
使用快捷键
F12
或者
Ctrl+Shift+I
Evaluation Warning : The document was created with Spire.PDF for java.
3.2
获取
Cookie
获取客户端携带的所有
Cookie
,使用
request
对象
遍历数组,获取每一个
Cookie
对象:
for
使用
Cookie
对象方法获取数据
介绍完获取
Cookie
对应的步骤后,接下面再通过一个案例来完成
Cookie
的获取,具体实现步骤为
:
需求
:
在
Servlet
中获取前一个案例存入在
Cookie
对象中的数据
1.
编写一个新
Servlet
类,名称为
BServlet
2.
在
BServlet
中使用
request
对象获取
Cookie
数组,遍历数组,从数据中获取指定名称对应的
值
3.
启动测试,在控制台打印出获取的值
(1)
编写一个新
Servlet
类,名称为
BServlet
(
2
)在
BServlet
中使用
request
对象获取
Cookie
数组,遍历数组,从数据中获取指定名称对应的
值
C
o
o
k
i
e
[
]
c
o
o
k
i
e
s
=
r
e
q
u
e
s
t
.
g
e
t
C
o
o
k
i
e
s
(
)
;
1
c
o
o
k
i
e
.
g
e
t
N
a
m
e
(
)
;
c
o
o
k
i
e
.
g
e
t
V
a
l
u
e
(
)
;
1
2
@
W
e
b
S
e
r
v
l
e
t
(
"
/
b
S
e
r
v
l
e
t
"
)
p
u
b
l
i
c
c
l
a
s
s
B
S
e
r
v
l
e
t
e
x
t
e
n
d
s
H
t
t
p
S
e
r
v
l
e
t
{
@
O
v
e
r
r
i
d
e
p
r
o
t
e
c
t
e
d
v
o
i
d
d
o
G
e
t
(
H
t
t
p
S
e
r
v
l
e
t
R
e
q
u
e
s
t
r
e
q
u
e
s
t
,
H
t
t
p
S
e
r
v
l
e
t
R
e
s
p
o
n
s
e
r
e
s
p
o
n
s
e
)
t
h
r
o
w
s
S
e
r
v
l
e
t
E
x
c
e
p
t
i
o
n
,
I
O
E
x
c
e
p
t
i
o
n
{
}
@
O
v
e
r
r
i
d
e
p
r
o
t
e
c
t
e
d
v
o
i
d
d
o
P
o
s
t
(
H
t
t
p
S
e
r
v
l
e
t
R
e
q
u
e
s
t
r
e
q
u
e
s
t
,
H
t
t
p
S
e
r
v
l
e
t
R
e
s
p
o
n
s
e
r
e
s
p
o
n
s
e
)
t
h
r
o
w
s
S
e
r
v
l
e
t
E
x
c
e
p
t
i
o
n
,
I
O
E
x
c
e
p
t
i
o
n
{
t
h
i
s
.
d
o
G
e
t
(
r
e
q
u
e
s
t
,
r
e
s
p
o
n
s
e
)
;
}
}
1
2
3
4
5
6
7
8
9
1
0
1
1
1
2
@
W
e
b
S
e
r
v
l
e
t
(
"
/
b
S
e
r
v
l
e
t
"
)
p
u
b
l
i
c
c
l
a
s
s
B
S
e
r
v
l
e
t
e
x
t
e
n
d
s
H
t
t
p
S
e
r
v
l
e
t
{
@
O
v
e
r
r
i
d
e
p
r
o
t
e
c
t
e
d
v
o
i
d
d
o
G
e
t
(
H
t
t
p
S
e
r
v
l
e
t
R
e
q
u
e
s
t
r
e
q
u
e
s
t
,
H
t
t
p
S
e
r
v
l
e
t
R
e
s
p
o
n
s
e
r
e
s
p
o
n
s
e
)
t
h
r
o
w
s
S
e
r
v
l
e
t
E
x
c
e
p
t
i
o
n
,
I
O
E
x
c
e
p
t
i
o
n
{
/
/
获
取
C
o
o
k
i
e
1
2
3
4
5
Evaluation Warning : The document was created with Spire.PDF for java.